home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1191 / 1191.xpi / chrome / reminderfox.jar / content / reminderfox / datepicker / datepicker.js < prev   
Text File  |  2010-01-29  |  52KB  |  1,411 lines

  1. /* Thanks to Sandesh Karalkar for the original datepicker widget code */
  2.  
  3. function oeDatePicker()  {
  4.  }
  5.  
  6. /**
  7. *   Static variables
  8. */
  9.  
  10. /** The popup window containing the picker */
  11.  oeDatePicker.gPopup  = null;
  12.  
  13.  
  14. /** The original starting date and currently selected date */
  15.  oeDatePicker.gOriginalDate = null; 
  16.  oeDatePicker.gSelectedDate = null; 
  17.  oeDatePicker.launchAdd = false;
  18.  
  19.  /* selected items */
  20.  oeDatePicker.gSelectedMonthItem = null;
  21.  oeDatePicker.gSelectedDayItem = null;
  22.  
  23.  oeDatePicker.gTodaysDate = new Date();
  24.  
  25.  oeDatePicker.gStartingDayOfWeek = 0; // 0 for Sunday, 1 for Monday, etc
  26.  
  27.  oeDatePicker.isDatePicker = false;
  28.  
  29.   oeDatePicker.isQuickAlarm = false;
  30.   
  31.   oeDatePicker.isShowCalendar = false;
  32.  
  33. /**
  34. *   Set up the picker, called when the popup pops
  35. */
  36. oeDatePicker.onpopupshowing = function( startDate, isDatePicker, isQuickAlarm, isShowCalendar) {
  37.    oeDatePicker.gTodaysDate = new Date();
  38.     if ( isDatePicker ) {
  39.         oeDatePicker.isDatePicker = true;
  40.     }
  41.     
  42.     if ( isQuickAlarm ) {
  43.         oeDatePicker.isQuickAlarm = true;
  44.     }
  45.     else {
  46.         oeDatePicker.isQuickAlarm = false;
  47.     }
  48.     
  49.     if ( isShowCalendar ) {
  50.         oeDatePicker.isShowCalendar = true;
  51.     }
  52.     else {
  53.         oeDatePicker.isShowCalendar = false;
  54.     }
  55.     
  56.     
  57.     try {
  58.         oeDatePicker.gStartingDayOfWeek = reminderFox_prefs.getIntPref(REMINDER_FOX_PREF + "." + REMINDER_FOX_CALENDAR_START_DAY);
  59.     } catch(e) {
  60.         oeDatePicker.gStartingDayOfWeek = REMINDER_FOX_CALENDAR_START_DAY_DEFAULT;
  61.     }    
  62.     
  63.     // redraw dates if neccessary
  64.     if ( oeDatePicker.gStartingDayOfWeek != 0 ) {
  65.         for ( var i = 0; i < 7; i++ ) {
  66.             var dayItem = document.getElementById( "calDay" + i  );
  67.             var modifiedNumber = i + oeDatePicker.gStartingDayOfWeek;
  68.             modifiedNumber = reminderFox_mod( modifiedNumber , 7);            
  69.              dayItem.setAttribute( "value", reminderFox_getBundle().getString("rf.options.day." + modifiedNumber + ".name.MMM"));
  70.             // mark "Sunday" as Red
  71.             var dayBox = document.getElementById( "oe-date-picker-month-day-" + (i+1) + "-header-box" );
  72.             if ( modifiedNumber == 0 ) {
  73.                 dayBox.setAttribute( "class",  "oe-date-picker-month-days-header-class-red");
  74.             }
  75.             else {
  76.                 dayBox.setAttribute( "class",  "oe-date-picker-month-days-box-header-class");                
  77.             }
  78.         }
  79.     }
  80.     
  81.    oeDatePicker.gOriginalDate = new Date( startDate );
  82.    oeDatePicker.gSelectedDate = new Date( startDate );
  83.    
  84.    // draw the year based on the selected date   
  85.    oeDatePicker.redrawYear();
  86.    // draw the month based on the selected date   
  87.    var month = oeDatePicker.gSelectedDate.getMonth() + 1;
  88.    var selectedMonthBoxItem = document.getElementById( "oe-date-picker-year-month-" + month + "-box"  );
  89.    oeDatePicker.selectMonthItem( selectedMonthBoxItem );
  90.    
  91.    // draw in the days for the selected date
  92.    oeDatePicker.redrawDays();
  93. }
  94.  
  95.  
  96. oeDatePicker.gotoToday = function () {
  97.     oeDatePicker.gSelectedDate = oeDatePicker.gTodaysDate;
  98.     oeDatePicker.onpopupshowing(oeDatePicker.gSelectedDate,  oeDatePicker.isDatePicker,  oeDatePicker.isQuickAlarm, oeDatePicker.isShowCalendar);
  99.     
  100.     if ( !oeDatePicker.isDatePicker ) {
  101.         // reset the reminder array, so all reminders will be re-added in case the year-change affects
  102.         // them (like <1978> style reminders)
  103.         calendarReminderArray = null;
  104.         calendarTodoArray = null;
  105.     }
  106.     
  107.    // update the selected date
  108.        if ( !oeDatePicker.isDatePicker ) {
  109.            var oldYear = oeDatePicker.gSelectedDate.getFullYear(); 
  110.        // redraw the year and the days
  111.        repopulateListForYear( oldYear , oeDatePicker.gSelectedDate.getFullYear() );
  112.        }
  113.    
  114.    oeDatePicker.redrawYear();
  115.    oeDatePicker.redrawDays();
  116.    
  117.        if ( !oeDatePicker.isDatePicker ) {
  118.        selectCalendarSync = false;
  119.         highlightClosestUpcomingReminder( oeDatePicker.gSelectedDate  );    
  120.         selectCalendarSync = true;
  121.        }
  122.     
  123.     if ( !oeDatePicker.isDatePicker ) {
  124.         highlightReminderForDate( oeDatePicker.gSelectedDate.getMonth(), oeDatePicker.gSelectedDate.getDate()  );
  125.     }
  126.  
  127. /**
  128. *   Called when a day is clicked, close the picker and call the client's oncommand
  129. */
  130. oeDatePicker.clickDay = function( element, newDayItemNumber ) {
  131.    // get the clicked day
  132.    var dayNumberItem = document.getElementById( "oe-date-picker-month-day-text-" + newDayItemNumber );
  133.    
  134.    var dayNumber = dayNumberItem.getAttribute( "value" );
  135.    
  136.    // they may have clicked an unfilled day, if so ignore it and leave the picker up
  137.    if (dayNumber == "") {
  138.        if (newDayItemNumber < 20) {
  139.         // if this is at the start of the month....  see how far ahead of month start we are
  140.         var found = false;
  141.         for (var i = newDayItemNumber + 1; i < 43 && !found; i++) {
  142.             var dayNumberItemLookAhead = document.getElementById("oe-date-picker-month-day-text-" + i);
  143.             var dayNumberLookAhead = dayNumberItemLookAhead.getAttribute("value");
  144.             if (dayNumberLookAhead != "") {
  145.                 // we found the first value
  146.                 var daysBefore = newDayItemNumber - i;
  147.                 // set the selected date to what they clicked on
  148.                 oeDatePicker.gSelectedDate.setDate(daysBefore+1);
  149.                 oeDatePicker.onpopupshowing(oeDatePicker.gSelectedDate,  oeDatePicker.isDatePicker,  oeDatePicker.isQuickAlarm, oeDatePicker.isShowCalendar);
  150.                 found = true;
  151.                 
  152.                 if ( !oeDatePicker.isDatePicker ) {
  153.                     highlightReminderForDate( oeDatePicker.gSelectedDate.getMonth(), oeDatePicker.gSelectedDate.getDate()  );
  154.                 }
  155.                 else {
  156.                     if ( oeDatePicker.isQuickAlarm || oeDatePicker.isShowCalendar ) {
  157.                         // do nothing
  158.                     }
  159.                     else {
  160.                         // we never want to close the window in this case
  161.                         //var popup = reminderFox_findParentById( element, "oe-date-picker-popup", "oe-date-picker-popup-end" );
  162.                         //popup.hidePopup();
  163.                     }
  164.                 }
  165.                 
  166.             }
  167.         }           
  168.     }
  169.     else {
  170.         var found = false;
  171.         for (var i = newDayItemNumber - 1; i >= 0 && !found; i--) {
  172.             var dayNumberItemLookAhead = document.getElementById("oe-date-picker-month-day-text-" + i);
  173.             var dayNumberLookAhead = dayNumberItemLookAhead.getAttribute("value");
  174.             if (dayNumberLookAhead != "") {
  175.                 // we found the first value
  176.                 
  177.                 var daysAfter = newDayItemNumber - i;
  178.                 // set the selected date to what they clicked on
  179.                 
  180.                 // set date to first date; otherwise if it is Jan 29 for isntance, 
  181.                 // when we advance the month it will go to March (because Feb only has 28 days)
  182.                 oeDatePicker.gSelectedDate.setDate(1);  
  183.                 oeDatePicker.gSelectedDate.setMonth(oeDatePicker.gSelectedDate.getMonth() + 1);
  184.                 oeDatePicker.gSelectedDate.setDate(daysAfter);
  185.                 
  186.                 oeDatePicker.onpopupshowing(oeDatePicker.gSelectedDate,  oeDatePicker.isDatePicker,  oeDatePicker.isQuickAlarm, oeDatePicker.isShowCalendar);
  187.                 found = true;
  188.                 if ( !oeDatePicker.isDatePicker ) {
  189.                     highlightReminderForDate( oeDatePicker.gSelectedDate.getMonth(), oeDatePicker.gSelectedDate.getDate()  );
  190.                 }
  191.                 else {
  192.                     if ( oeDatePicker.isQuickAlarm || oeDatePicker.isShowCalendar ) {
  193.                         // do nothing
  194.                     }
  195.                     else {
  196.                         // we never want to close the window in this case
  197.                         //var popup = reminderFox_findParentById( element, "oe-date-picker-popup", "oe-date-picker-popup-end" );
  198.                         //popup.hidePopup();
  199.                     }
  200.                 }
  201.                 
  202.             }
  203.         }    
  204.      }
  205.    }
  206.    else if( dayNumber != "" )  {
  207.          // set the selected date to what they clicked on
  208.          oeDatePicker.gSelectedDate.setDate( dayNumber );
  209.          oeDatePicker.redrawDays();
  210.         if ( !oeDatePicker.isDatePicker ) {
  211.             highlightReminderForDate( oeDatePicker.gSelectedDate.getMonth(), oeDatePicker.gSelectedDate.getDate()  );
  212.         }
  213.         else {
  214.             if ( oeDatePicker.isQuickAlarm  ) {
  215.                 // do nothing; the user must click the OK button in the quick alarm case to close
  216.             }
  217.             else {
  218.                 var popup = reminderFox_findParentById( element, "oe-date-picker-popup", "oe-date-picker-popup-end" );
  219.                 popup.hidePopup();
  220.                 if( oeDatePicker.launchAdd ) {
  221.                     oeDatePicker.launchAdd = false; 
  222.                     var reminderId =reminderFox_generateUniqueReminderId(  oeDatePicker.gSelectedDate );
  223.                     var newReminderToBeAdded = new ReminderFoxEvent( reminderId,  oeDatePicker.gSelectedDate, null );
  224.                     reminderFox_addReminderHeadlessly( newReminderToBeAdded );    
  225.                 }
  226.             }
  227.         }
  228.    }
  229.     
  230.     var remindersTab = document.getElementById("remindersTab");
  231.       if ( remindersTab != null  ) {   // ignore this if we are doing a popup from within the Event dialog
  232.         var displayListIndex = getDisplayIndex();
  233.         // week
  234.          if ( displayListIndex == 2 ) {
  235.              if ( isReminderTabSelected() ) {            
  236.                 displayTypeChanged();
  237.              }
  238.              else {
  239.                  displayTypeChangedTodo();
  240.              }
  241.             oeDatePicker.redrawDays();    
  242.             return;
  243.         }
  244.         // day
  245.         if ( displayListIndex == 3 ) {
  246.             if ( isReminderTabSelected() ) {            
  247.                 displayTypeChanged();
  248.              }
  249.              else {
  250.                  displayTypeChangedTodo();
  251.              }
  252.             oeDatePicker.redrawDays();    
  253.             return;
  254.         }            
  255.       }        
  256. }
  257.  
  258.  
  259. /**
  260. * Called when a month box is clicked 
  261. */
  262.  
  263. oeDatePicker.clickMonth = function( newMonthItem, newMonthNumber ){
  264.    // already selected, return
  265.    if( oeDatePicker.gSelectedMonthItem  == newMonthItem )   {
  266.       return;
  267.    }
  268.    
  269.    // Avoid problems when changing months if the date is at the end of the month
  270.    // i.e. if date is 31 march and you do a setmonth to april, the month would
  271.    // actually be set to may, beacause april only has 30 days.
  272.    // This is why we keep the original date around.
  273.    var oldDate = oeDatePicker.gSelectedDate.getDate();
  274.    var yearNumber = oeDatePicker.gSelectedDate.getFullYear();
  275.    
  276.    var lastDayOfMonth = oeDatePicker.getLastDayOfMonth( yearNumber, newMonthNumber-1 );
  277.  
  278.    if ( oldDate > lastDayOfMonth )  {
  279.        oeDatePicker.gSelectedDate.setDate(lastDayOfMonth);
  280.    }
  281.    
  282.    // update the selected date   
  283.    oeDatePicker.gSelectedDate.setMonth( newMonthNumber - 1 );
  284.    
  285.    // select Month   
  286.    oeDatePicker.selectMonthItem( newMonthItem );
  287.  
  288.    // redraw days
  289.    oeDatePicker.redrawDays();
  290.  
  291.     var remindersTab = document.getElementById("remindersTab");
  292.       if ( remindersTab != null  ) {   // ignore this if we are doing a popup from within the Event dialog
  293.         var displayListIndex = getDisplayIndex();
  294.  
  295.         // month
  296.         if ( displayListIndex == 1 ) {
  297.             if ( isReminderTabSelected() ) {            
  298.                 displayTypeChanged();
  299.              }
  300.              else {
  301.                  displayTypeChangedTodo();
  302.              }
  303.             oeDatePicker.redrawDays();                
  304.         }
  305.         // week
  306.         else if ( displayListIndex == 2 ) {
  307.             if ( isReminderTabSelected() ) {            
  308.                 displayTypeChanged();
  309.              }
  310.              else {
  311.                  displayTypeChangedTodo();
  312.              }
  313.             oeDatePicker.redrawDays();
  314.             return;
  315.         }
  316.         // day
  317.         if ( displayListIndex == 3 ) {
  318.             if ( isReminderTabSelected() ) {            
  319.                 displayTypeChanged();
  320.              }
  321.              else {
  322.                  displayTypeChangedTodo();
  323.              }
  324.             oeDatePicker.redrawDays();
  325.             return;
  326.         }    
  327.       }
  328. }
  329.  
  330. oeDatePicker.getLastDayOfMonth = function( year, month  ) {
  331.    var pastLastDate = new Date( year, month, 32 );
  332.    var lastDayOfMonth = 32 - pastLastDate.getDate();
  333.    
  334.    return lastDayOfMonth;
  335. }
  336.  
  337. /**
  338. * Called when previous Year button is clicked 
  339. */
  340.  
  341. oeDatePicker.previousYearCommand = function() {
  342.     if ( !oeDatePicker.isDatePicker ) {
  343.         // reset the reminder array, so all reminders will be re-added in case the year-change affects
  344.         // them (like <1978> style reminders)
  345.         calendarReminderArray = null;
  346.         calendarTodoArray = null;
  347.     }
  348.     
  349.    // update the selected date
  350.    var oldDate = oeDatePicker.gSelectedDate.getDate();
  351.    var oldYear = oeDatePicker.gSelectedDate.getFullYear(); 
  352.    var lastDayOfMonth = oeDatePicker.getLastDayOfMonth( (oldYear - 1), oeDatePicker.gSelectedDate.getMonth() );
  353.     
  354.     // handle leap year scenario (Feb. 29 is selected and then the year is changed)
  355.    if ( oldDate > lastDayOfMonth )
  356.    {
  357.        oeDatePicker.gSelectedDate.setDate(lastDayOfMonth);
  358.    }
  359.  
  360.    oeDatePicker.gSelectedDate.setFullYear( oldYear - 1 ); 
  361.    
  362.        if ( !oeDatePicker.isDatePicker ) {
  363.         repopulateListForYear( oldYear, oeDatePicker.gSelectedDate.getFullYear() );
  364.        }
  365.    // redraw the year and the days   
  366.    oeDatePicker.redrawYear();   
  367.    oeDatePicker.redrawDays();
  368.  
  369.     if ( !oeDatePicker.isDatePicker ) {
  370.            selectCalendarSync = false;
  371.         highlightClosestUpcomingReminder( oeDatePicker.gSelectedDate  );   
  372.         selectCalendarSync = true;
  373.     }
  374. }
  375.  
  376.  
  377.  
  378. oeDatePicker.previousMonthCommand = function() {
  379.     if ( !oeDatePicker.isDatePicker ) {
  380.         // reset the reminder array, so all reminders will be re-added in case the year-change affects
  381.         // them (like <1978> style reminders)
  382.         calendarReminderArray = null;
  383.         calendarTodoArray = null;
  384.     }
  385.     
  386.    // update the selected date
  387.    var oldDate = oeDatePicker.gSelectedDate.getDate();
  388.    var oldMonth = oeDatePicker.gSelectedDate.getMonth();
  389.    var oldYear = oeDatePicker.gSelectedDate.getFullYear(); 
  390.    var lastDayOfMonth = oeDatePicker.getLastDayOfMonth( oldYear, oeDatePicker.gSelectedDate.getMonth() - 1);
  391.     
  392.     // handle leap year scenario (Feb. 29 is selected and then the year is changed)
  393.    if ( oldDate > lastDayOfMonth )
  394.    {
  395.        oeDatePicker.gSelectedDate.setDate(lastDayOfMonth);
  396.    }
  397.  
  398.    oeDatePicker.gSelectedDate.setMonth( oldMonth - 1 ); 
  399.    
  400.    // draw the month based on the selected date   
  401.    var month = oeDatePicker.gSelectedDate.getMonth() + 1;
  402.    var selectedMonthBoxItem = document.getElementById( "oe-date-picker-year-month-" + month + "-box"  );
  403.    oeDatePicker.selectMonthItem( selectedMonthBoxItem );
  404.    
  405.    
  406.        if ( !oeDatePicker.isDatePicker ) {
  407.         repopulateListForYear( oldYear, oeDatePicker.gSelectedDate.getFullYear() );
  408.        }
  409.    // redraw the year and the days   
  410.    oeDatePicker.redrawYear();   
  411.    oeDatePicker.redrawDays();
  412.  
  413.     if ( !oeDatePicker.isDatePicker ) {
  414.            selectCalendarSync = false;
  415.         highlightClosestUpcomingReminder( oeDatePicker.gSelectedDate  );   
  416.         selectCalendarSync = true;
  417.     }
  418. }
  419.  
  420.  
  421. /**
  422. * Called when next Year button is clicked 
  423. */
  424.  
  425. oeDatePicker.nextYearCommand = function() {
  426.     if ( !oeDatePicker.isDatePicker ) {
  427.         // reset the reminder array, so all reminders will be re-added in case the year-change affects
  428.         // them (like <1978> style reminders)
  429.         calendarReminderArray = null;
  430.         calendarTodoArray = null;
  431.     }
  432.     
  433.    // update the selected date
  434.    var oldDate = oeDatePicker.gSelectedDate.getDate();
  435.    var oldYear = oeDatePicker.gSelectedDate.getFullYear(); 
  436.    var lastDayOfMonth = oeDatePicker.getLastDayOfMonth( (oldYear + 1), oeDatePicker.gSelectedDate.getMonth() );
  437.     
  438.     // handle leap year scenario (Feb. 29 is selected and then the year is changed)
  439.    if ( oldDate > lastDayOfMonth )  {
  440.        oeDatePicker.gSelectedDate.setDate(lastDayOfMonth);
  441.    }   
  442.    
  443.    oeDatePicker.gSelectedDate.setFullYear( oldYear + 1 ); 
  444.    
  445.        if ( !oeDatePicker.isDatePicker ) {
  446.        // redraw the year and the days
  447.        repopulateListForYear( oldYear , oeDatePicker.gSelectedDate.getFullYear() );
  448.        }
  449.    
  450.    oeDatePicker.redrawYear();
  451.    oeDatePicker.redrawDays();
  452.    
  453.        if ( !oeDatePicker.isDatePicker ) {
  454.        selectCalendarSync = false;
  455.         highlightClosestUpcomingReminder( oeDatePicker.gSelectedDate  );    
  456.         selectCalendarSync = true;
  457.        }
  458. }
  459.  
  460. oeDatePicker.nextMonthCommand = function() {
  461.     if ( !oeDatePicker.isDatePicker ) {
  462.         // reset the reminder array, so all reminders will be re-added in case the year-change affects
  463.         // them (like <1978> style reminders)
  464.         calendarReminderArray = null;
  465.         calendarTodoArray = null;
  466.     }
  467.     
  468.    // update the selected date
  469.    var oldDate = oeDatePicker.gSelectedDate.getDate();
  470.    var oldYear = oeDatePicker.gSelectedDate.getFullYear(); 
  471.    var oldMonth = oeDatePicker.gSelectedDate.getMonth(); 
  472.    var lastDayOfMonth = oeDatePicker.getLastDayOfMonth( oldYear, oeDatePicker.gSelectedDate.getMonth() + 1 );
  473.     
  474.     // handle leap year scenario (Feb. 29 is selected and then the year is changed)
  475.    if ( oldDate > lastDayOfMonth )  {
  476.        oeDatePicker.gSelectedDate.setDate(lastDayOfMonth);
  477.    }   
  478.    
  479.    oeDatePicker.gSelectedDate.setMonth( oldMonth + 1 ); 
  480.    
  481.    // draw the month based on the selected date   
  482.    var month = oeDatePicker.gSelectedDate.getMonth() + 1;
  483.    var selectedMonthBoxItem = document.getElementById( "oe-date-picker-year-month-" + month + "-box"  );
  484.    oeDatePicker.selectMonthItem( selectedMonthBoxItem );
  485.    
  486.        if ( !oeDatePicker.isDatePicker ) {
  487.        // redraw the year and the days
  488.        repopulateListForYear( oldYear , oeDatePicker.gSelectedDate.getFullYear() );
  489.        }
  490.    
  491.    oeDatePicker.redrawYear();
  492.    oeDatePicker.redrawDays();
  493.    
  494.        if ( !oeDatePicker.isDatePicker ) {
  495.        selectCalendarSync = false;
  496.         highlightClosestUpcomingReminder( oeDatePicker.gSelectedDate  );    
  497.         selectCalendarSync = true;
  498.        }
  499. }
  500.  
  501.  
  502.  
  503. /**
  504. * Draw the year based in the selected date 
  505. */
  506.  
  507. oeDatePicker.redrawYear = function() {
  508.    var yearTitleItem = document.getElementById( "oe-date-picker-year-title-text" );
  509.    yearTitleItem.setAttribute( "value", oeDatePicker.gSelectedDate.getFullYear() );
  510. }
  511.  
  512.  
  513. oeDatePicker.resizeCalendar = function() {
  514.   var calendarSize = 1;
  515.   try {
  516.         calendarSize = reminderFox_prefs.getIntPref(REMINDER_FOX_PREF + "." + REMINDER_FOX_CALENDAR_SIZE);
  517.     } catch(e) {        
  518.     }    
  519.  
  520.     if ( calendarSize > 1  ) {  // large 
  521.         var datePicker =document.getElementById('oe-date-picker-overlay-box');
  522.         datePicker.setAttribute( "large", "true");
  523.         
  524.         for ( var i = 1; i <= 42; i++ ) {
  525.             var monthBox = "oe-date-picker-month-day-" + i + "-box";
  526.             var monthBoxElement = document.getElementById(monthBox);
  527.             monthBoxElement.setAttribute( "large", "large");
  528.         }
  529.         
  530.         for ( var i = 1; i <= 6; i++ ) {
  531.             var monthBox = "oe-date-picker-week-" + i + "-box";
  532.             var monthBoxElement = document.getElementById(monthBox);
  533.             monthBoxElement.setAttribute( "large", "true");
  534.         }
  535.     }
  536.     else if ( calendarSize < 1 ) { // small 
  537.         var datePicker =document.getElementById('oe-date-picker-overlay-box');
  538.         datePicker.setAttribute( "small", "true");
  539.         
  540.         for ( var i = 1; i <= 42; i++ ) {
  541.             var monthBox = "oe-date-picker-month-day-" + i + "-box";
  542.             var monthBoxElement = document.getElementById(monthBox);
  543.             monthBoxElement.setAttribute( "small", "true");
  544.         }
  545.         
  546.         for ( var i = 1; i <= 6; i++ ) {
  547.             var monthBox = "oe-date-picker-week-" + i + "-box";
  548.             var monthBoxElement = document.getElementById(monthBox);
  549.             monthBoxElement.setAttribute( "small", "true");
  550.         }
  551.     }
  552. }
  553.  
  554. /**
  555. * Select a month box 
  556. */
  557.  
  558. oeDatePicker.selectMonthItem = function( newMonthItem ) {
  559.    // clear old selection, if there is one   
  560.    
  561.    if( oeDatePicker.gSelectedMonthItem != null )  { 
  562.            var id = oeDatePicker.gSelectedMonthItem.getAttribute( "id" ) ;
  563.            document.getElementById( id ).setAttribute( "selected" , false );  // set the poetenially cloned one as cleared
  564.          oeDatePicker.gSelectedMonthItem.setAttribute( "selected" , false );      
  565.    }
  566.  
  567.    if ( newMonthItem != null ) { 
  568.           // Set the selected attribute, used to give it a different style   
  569.         newMonthItem.setAttribute( "selected" , true );
  570.    }
  571.       
  572.    // Remember new selection  
  573.   oeDatePicker.gSelectedMonthItem = newMonthItem;
  574. }
  575.  
  576.  
  577. /**
  578. * Select a day box 
  579. */
  580.  
  581. oeDatePicker.selectDayItem = function( newDayItem ) {
  582.    // clear old selection, if there is one   
  583.    if( oeDatePicker.gSelectedDayItem != null )   {
  584.          oeDatePicker.gSelectedDayItem.setAttribute( "selected" , false );
  585.       oeDatePicker.gSelectedDayItem.setAttribute( "selectedReminder" , false );
  586.    }
  587.  
  588.    if( newDayItem != null )   {
  589.          // Set the selected attribute, used to give it a different style
  590.            var reminderDay =  newDayItem.getAttribute( "reminder" );
  591.         if ( reminderDay == "true" ) { 
  592.             newDayItem.setAttribute( "selectedReminder" , true );
  593.         }
  594.         else {
  595.           newDayItem.setAttribute( "selected" , true );
  596.           newDayItem.setAttribute( "selectedReminder" , false );
  597.         }
  598.    }
  599.          
  600.    // Remember new selection      
  601.    oeDatePicker.gSelectedDayItem = newDayItem;
  602. }
  603.  
  604.  
  605. /**
  606. * Redraw day numbers based on the selected date
  607. */
  608.  
  609. oeDatePicker.redrawDays = function( ) {
  610.     var dayNumberBoxItem;
  611.  
  612.    if ( oeDatePicker.gSelectedDate == null ) {
  613.        oeDatePicker.gSelectedDate = new Date();
  614.    }
  615.    // Write in all the day numbers
  616.    var firstDate = new Date( oeDatePicker.gSelectedDate.getFullYear(), oeDatePicker.gSelectedDate.getMonth(), 1 );   
  617.    var firstDayOfWeek = firstDate.getDay() - oeDatePicker.gStartingDayOfWeek;
  618.    if ( firstDayOfWeek < 0 ) {
  619.       firstDayOfWeek =  firstDate.getDay() + (7 - oeDatePicker.gStartingDayOfWeek);
  620.   }
  621.   
  622.    var lastDayOfMonth = oeDatePicker.getLastDayOfMonth( oeDatePicker.gSelectedDate.getFullYear(), oeDatePicker.gSelectedDate.getMonth() )
  623.    var currentFirstDate = new Date( oeDatePicker.gTodaysDate.getFullYear(), oeDatePicker.gTodaysDate.getMonth(), 1 );
  624.    var firstDayOfCurrentDateWeek = currentFirstDate.getDay()  - oeDatePicker.gStartingDayOfWeek;
  625.    if ( firstDayOfCurrentDateWeek < 0 ) {
  626.       firstDayOfCurrentDateWeek =  currentFirstDate.getDay() + (7 - oeDatePicker.gStartingDayOfWeek);
  627.   }
  628.  
  629.    // clear the selected day item   
  630.    oeDatePicker.selectDayItem( null ); 
  631.   
  632.    var monthArray = null;   
  633.    var isReminder = true;
  634.    var remindersTab = document.getElementById("remindersTab");
  635.    var lastMonthArray = null;
  636.    if ( remindersTab != null  ) {   // ignore this if we are doing a popup from within the Event dialog
  637.         if ( isReminderTabSelected() ) {            
  638.            if ( calendarReminderArray == null ) {               
  639.                    createCalendarReminderArray();                                  
  640.                }
  641.                monthArray = calendarReminderArray[oeDatePicker.gSelectedDate.getMonth()];
  642.                if ( oeDatePicker.gSelectedDate.getMonth() > 0 ) {
  643.                    lastMonthArray = calendarReminderArray[oeDatePicker.gSelectedDate.getMonth()-1];
  644.                }
  645.         }
  646.         else {
  647.             isReminder = false;
  648.                if ( calendarTodoArray == null ) {
  649.                    createCalendarTodoArray();
  650.                }
  651.                 monthArray = calendarTodoArray[oeDatePicker.gSelectedDate.getMonth()];
  652.                 if ( oeDatePicker.gSelectedDate.getMonth() > 0 ) {
  653.                    lastMonthArray = calendarTodoArray[oeDatePicker.gSelectedDate.getMonth()-1];
  654.                }
  655.         }
  656.    }
  657.    else { 
  658.      if ( oeDatePicker.launchAdd ) {
  659.        var calendarReminderArray2 = null;
  660.        if ( calendarReminderArray2 == null ) {               
  661.             calendarReminderArray2 = createCalendarReminderArray2();                                  
  662.         }
  663.         monthArray = calendarReminderArray2[oeDatePicker.gSelectedDate.getMonth()];
  664.         if ( oeDatePicker.gSelectedDate.getMonth() > 0 ) {
  665.             lastMonthArray = calendarReminderArray2[oeDatePicker.gSelectedDate.getMonth()-1];
  666.         }
  667.       }
  668.     }
  669.    
  670.     var startOfThisMonthDate = new Date(oeDatePicker.gSelectedDate.getFullYear(), oeDatePicker.gSelectedDate.getMonth(), 0);
  671.     var multipleDayEvents = new Array();
  672.     var lastMonthReminders = new Array();
  673.     // for performance; we just check last 3 days
  674.      if ( lastMonthArray != null && lastMonthArray.length > 0) {
  675.          for ( var i = (lastMonthArray.length-4); i < lastMonthArray.length; i++ ) {
  676.              var reminderDaysArray = lastMonthArray[i];
  677.              if ( reminderDaysArray != null ) { 
  678.                     for ( var j = 0; j < reminderDaysArray.length; j++ ) {
  679.                         var reminder = reminderDaysArray[j];
  680.                          reminderFox_addMultipleEndDates( reminder, startOfThisMonthDate, lastMonthReminders );
  681.                     }    
  682.              }
  683.          }
  684.          
  685.          // now convert to this multipleenddate
  686.          for ( var i = 0; i < lastMonthReminders.length; i++ ) {
  687.              var lastMonthReminder = lastMonthReminders[i];
  688.              var important =     lastMonthReminder.priority == REMINDER_PRIORITY_IMPORTANT;
  689.              var completed = false;
  690.              if ( lastMonthReminder.completedDate != null )  {
  691.                 if ( isReminder ) {
  692.                     var calendarDate = new Date(oeDatePicker.gSelectedDate.getFullYear(),oeDatePicker.gSelectedDate.getMonth(), lastMonthReminder.date.getDate() );
  693.                     // continue if marked complete
  694.                     if ( reminderFox_isCompletedForDate(lastMonthReminder, calendarDate ) ) {                    
  695.                         completed = true;                            
  696.                     }
  697.                 }
  698.                 else {
  699.                     completed = true; // todo's should be shown as completed regardless of their date (as they have no multiple date occurrences)
  700.                 }
  701.             }
  702.              
  703.              
  704.             if ( lastMonthReminder.allDayEvent ) {
  705.                 if (lastMonthReminder.durationTime >86400000 ) {   // 24 * 60 * 60 * 1000 = 1 day in ms
  706.                     //var reminderInstanceDate = new Date(oeDatePicker.gSelectedDate.getFullYear(),oeDatePicker.gSelectedDate.getMonth(), dayNumber );
  707.                     var reminderInstanceDate =lastMonthReminder.date;
  708.                     var reminderInstanceEndDate = new Date(reminderInstanceDate.getTime() + lastMonthReminder.durationTime);        
  709.                     reminderInstanceEndDate.setDate( reminderInstanceEndDate.getDate() - 1); // -1 enddate offset
  710.                     // set end date
  711.                     multipleDayEvents[multipleDayEvents.length] = { description: lastMonthReminder.summary, isCompleted:  completed,  isImportant: important, endDate: reminderInstanceEndDate };
  712.                 }
  713.             }
  714.             else {
  715.                 if ( lastMonthReminder.durationTime > 60000 ) {
  716.                     var reminderInstanceDate =lastMonthReminder.date;
  717.                     var reminderInstanceEndDate = new Date(reminderInstanceDate.getTime() + lastMonthReminder.durationTime);    
  718.                     
  719.                     if (reminderInstanceEndDate.getMonth() == reminderInstanceDate.getMonth() &&
  720.                         reminderInstanceEndDate.getDate() == reminderInstanceDate.getDate() ) {
  721.                         // same days..  do nothing
  722.                     }
  723.                     // multiple days
  724.                     else { 
  725.                         // set end date
  726.                         multipleDayEvents[multipleDayEvents.length] = { description: lastMonthReminder.summary, isCompleted:  completed,  isImportant: important, endDate: reminderInstanceEndDate };
  727.                     }
  728.                 }
  729.             }
  730.          
  731.          }
  732.      }
  733.     
  734.    // redraw each day box in the 7 x 6 grid 
  735.    var dayNumber = 1;
  736.    //    var multipleDayEvents = new Array();
  737.    for( var dayIndex = 0; dayIndex < 42; ++dayIndex )  {
  738.         // get the day text box
  739.           var dayNumberItem = document.getElementById( "oe-date-picker-month-day-text-" + (dayIndex + 1) );
  740.         dayNumberBoxItem = document.getElementById( "oe-date-picker-month-day-" + (dayIndex + 1) + "-box" );
  741.         
  742.         // clear old styles and tooltips
  743.         dayNumberBoxItem.setAttribute( "reminder" , false );
  744.         dayNumberBoxItem.setAttribute( "completedReminder" , false );        
  745.         dayNumberBoxItem.setAttribute( "important" , false );
  746.         dayNumberBoxItem.setAttribute("tooltip", "");
  747.         
  748.         // embolden today's date
  749.         if ( (oeDatePicker.gTodaysDate.getDate() + firstDayOfCurrentDateWeek) == (dayIndex + 1)
  750.             && oeDatePicker.gTodaysDate.getMonth() == oeDatePicker.gSelectedDate.getMonth()  && 
  751.                oeDatePicker.gTodaysDate.getYear() == oeDatePicker.gSelectedDate.getYear() ) {
  752.         
  753.                if ( dayNumberBoxItem.getAttribute("small") ) {
  754.                    dayNumberBoxItem.setAttribute( "smalltoday" , true );
  755.                }
  756.                else if ( dayNumberBoxItem.getAttribute("large") ) {
  757.                    dayNumberBoxItem.setAttribute( "largetoday" , true );
  758.                }
  759.                else {
  760.                    dayNumberBoxItem.setAttribute( "today" , true );
  761.                }
  762.           }
  763.         // clear other dates
  764.           else {
  765.                if ( dayNumberBoxItem.getAttribute("medium") ) {                           
  766.                    dayNumberBoxItem.removeAttribute( "smalltoday");
  767.                }
  768.                else if ( dayNumberBoxItem.getAttribute("large") ) {                           
  769.                    dayNumberBoxItem.removeAttribute( "largetoday");
  770.                }
  771.                else {
  772.                    dayNumberBoxItem.removeAttribute( "today");
  773.                }
  774.            }
  775.         
  776.         
  777.         
  778.         
  779.         
  780.       // if it is an unfilled day ( before first or after last ), just set its value to "",
  781.          // and don't increment the day number.       
  782.       if( dayIndex < firstDayOfWeek || dayNumber > lastDayOfMonth )  {
  783.          dayNumberItem.setAttribute( "value" , "" );                
  784.       }
  785.       else {
  786.         var important = false;
  787.          // set the value to the day number         
  788.          dayNumberItem.setAttribute( "value" , dayNumber );         
  789.     
  790.          if ( monthArray != null ) {
  791.              var reminderDaysArray = monthArray[dayNumber-1];
  792.               
  793.               // clear old tooltip
  794. //                 var tooltipItem = document.getElementById( "day-"+dayNumber  +"-tooltip");
  795. //             while (tooltipItem.hasChildNodes()) {
  796. //                 tooltipItem.removeChild(tooltipItem.firstChild);
  797. //               }
  798.               if ( reminderDaysArray != null ) {
  799.                 var reminderAdded = false;
  800.                 var completedReminderAdded = false;
  801.                 
  802.                     for ( var  i = 0; i < reminderDaysArray.length; i++ ) {
  803.                     var     reminder = reminderDaysArray[i];
  804.                     var completed = false;
  805.                     // don't add reminder to calendar widget if the event has been completed already
  806.                     if ( reminder.completedDate != null )  {
  807.                         if ( isReminder ) {
  808.                             var calendarDate = new Date(oeDatePicker.gSelectedDate.getFullYear(),oeDatePicker.gSelectedDate.getMonth(), dayNumber );
  809.                             // continue if marked complete
  810.                             if ( reminderFox_isCompletedForDate(reminder, calendarDate ) ) {                    
  811.                                 completed = true;                            
  812.                             }
  813.                         }
  814.                         else {
  815.                             completed = true; // todo's should be shown as completed regardless of their date (as they have no multiple date occurrences)
  816.                         }
  817.                     }
  818.                      important =     reminder.priority == REMINDER_PRIORITY_IMPORTANT;
  819.                      if ( important && !completed) {
  820.                             dayNumberBoxItem.setAttribute( "important" , true );
  821.                       }                              
  822.  
  823.                     if ( completed ) {
  824.                         completedReminderAdded = true;
  825.                     }
  826.                     else {
  827.                         reminderAdded = true;
  828.                     }
  829.                     
  830.                     // check end dates
  831.                     var endDateAdded = false;                                        
  832.                     
  833.                     if ( reminder.durationTime != null ) {
  834.                         if ( reminder.allDayEvent ) {
  835.                             if (reminder.durationTime >86400000 ) {   // 24 * 60 * 60 * 1000 = 1 day in ms
  836.                                 //var reminderInstanceDate = new Date(oeDatePicker.gSelectedDate.getFullYear(),oeDatePicker.gSelectedDate.getMonth(), dayNumber );
  837.                                 var reminderInstanceDate =reminder.date;
  838.                                 var reminderInstanceEndDate = new Date(reminderInstanceDate.getTime() + reminder.durationTime);        
  839.                                 reminderInstanceEndDate.setDate( reminderInstanceEndDate.getDate() - 1); // -1 enddate offset
  840.                                 // set end date
  841.                                 multipleDayEvents[multipleDayEvents.length] = { description: reminder.summary, isCompleted:  completed,  isImportant: important, endDate: reminderInstanceEndDate };
  842.                                 endDateAdded = true;
  843.                             }
  844.                         }
  845.                         else {
  846.                             if ( reminder.durationTime > 60000 ) {
  847.                                 var reminderInstanceDate =reminder.date;
  848.                                 var reminderInstanceEndDate = new Date(reminderInstanceDate.getTime() + reminder.durationTime);    
  849.                                 
  850.                                 if (reminderInstanceEndDate.getMonth() == reminderInstanceDate.getMonth() &&
  851.                                     reminderInstanceEndDate.getDate() == reminderInstanceDate.getDate() ) {
  852.                                     // same days..  do nothing
  853.                                 }
  854.                                 // multiple days
  855.                                 else { 
  856.                                     // set end date
  857.                                     multipleDayEvents[multipleDayEvents.length] = { description: reminder.summary, isCompleted:  completed,  isImportant: important, endDate: reminderInstanceEndDate };
  858.                                     endDateAdded =true;
  859.                                 }
  860.                             }
  861.                         }
  862.                     }                    
  863.                  }
  864.              
  865.                  if ( reminderAdded ) {
  866.                     dayNumberBoxItem.setAttribute( "reminder" , true );
  867.                    dayNumberBoxItem.setAttribute("tooltip", "day-"+dayNumber +"-tooltip");
  868.                  }
  869.                  else if ( completedReminderAdded ) {
  870.                      dayNumberBoxItem.setAttribute( "completedReminder" , true );
  871.                       dayNumberBoxItem.setAttribute("tooltip", "day-"+dayNumber +"-tooltip");
  872.                  }
  873.             }
  874.             
  875.  
  876.             
  877.          }
  878.          
  879.          
  880.          
  881.         // check the previous month for end dates carrying over past today
  882.         if ( multipleDayEvents.length > 0 ) {      
  883.             var calendarDate = new Date(oeDatePicker.gSelectedDate.getFullYear(),oeDatePicker.gSelectedDate.getMonth(), dayNumber );
  884.              for ( var e = 0; e < multipleDayEvents.length; e++ ) {
  885.                  if ( calendarDate.getMonth() < multipleDayEvents[e].endDate.getMonth() || 
  886.                      (calendarDate.getMonth() == multipleDayEvents[e].endDate.getMonth() && 
  887.                          calendarDate.getDate() <= multipleDayEvents[e].endDate.getDate()) ) {
  888.                          if ( multipleDayEvents[e].isImportant  && !multipleDayEvents[e].isCompleted ) {
  889.                                 dayNumberBoxItem.setAttribute( "important" , true );
  890.                           }                 
  891.  
  892.                         if (  multipleDayEvents[e].isCompleted ) {
  893.                             dayNumberBoxItem.setAttribute( "completedReminder" , true );
  894.                               dayNumberBoxItem.setAttribute("tooltip", "day-"+dayNumber +"-tooltip");
  895.                         }
  896.                         else {
  897.                             dayNumberBoxItem.setAttribute( "reminder" , true );
  898.                            dayNumberBoxItem.setAttribute("tooltip", "day-"+dayNumber +"-tooltip");
  899.                         }
  900.                  }
  901.              }
  902.         }
  903.          
  904.          // draw the day as selected
  905.          if( dayNumber == oeDatePicker.gSelectedDate.getDate() ) 
  906.          {
  907.             dayNumberBoxItem = document.getElementById( "oe-date-picker-month-day-" + (dayIndex + 1) + "-box"  );
  908.             oeDatePicker.selectDayItem( dayNumberBoxItem );
  909.          }
  910.          
  911.          // advance the day number         
  912.          ++dayNumber;  
  913.       }
  914.    }
  915.    
  916.    redrawWeekNumbers();
  917.    
  918.        var multipleDayEvents = null;
  919.  }
  920.  
  921.  
  922.  function getStartAndEndDates2(displayListIndex, useToday) {
  923.     var year;
  924.     var month;
  925.     var day;
  926.     if ( oeDatePicker.gSelectedDate != null ) {
  927.         year = oeDatePicker.gSelectedDate.getFullYear();
  928.         month = oeDatePicker.gSelectedDate.getMonth();
  929.         day = oeDatePicker.gSelectedDate.getDate();
  930.     }
  931.     if ( year == null ) {
  932.         year = new Date().getFullYear();
  933.         month = new Date().getMonth();
  934.         day = new Date().getDate();
  935.         
  936.     }     
  937.     
  938.     var startAndEnd = { start: null, end: null };  
  939.  
  940.         startAndEnd.start = new Date( year, 0, 1 );  // start of year
  941.         startAndEnd.end  = new Date( year, 11, 31 );  // end of year
  942.     
  943.     return startAndEnd;
  944. }
  945.  
  946. function createCalendarReminderArray2() {
  947.     var monthArray;
  948.     var monthDay;    
  949.     var dayReminderArray;    
  950.     var newDayReminder;
  951.     var  length;
  952.     var val;
  953.         
  954.     var calendarReminderArray2 = new Array(12); 
  955.     var reminders = reminderFox_getReminderEvents();    
  956.     
  957.     var currentDate = oeDatePicker.gSelectedDate;
  958.     if ( currentDate == null ) {
  959.         currentDate = new Date();
  960.     }
  961.     var    year = currentDate.getFullYear();
  962.     var dateSpan = getStartAndEndDates2();
  963.     var todaysDate = new Date();
  964.     for( var i = 0; i < reminders.length; i++) {
  965.         var basereminder = reminders[i];
  966.         
  967.         var allReminders = reminderFox_getAllRemindersInDateRange( basereminder,  dateSpan.start, dateSpan.end, false );
  968.         var x;
  969.         // maybe make this a method that returns start/endindex
  970.         var startIndex = 0;
  971.         var endIndex = 0;
  972.         if ( allReminders.length > 0 ) {
  973.             endIndex  = allReminders.length;
  974.         }
  975.         if ( allReminders.length > 0) {
  976. //            if ( SHOW_ALL_REMINDERS ) {
  977.                 startIndex = 0;
  978.                 endIndex = allReminders.length;
  979. //            }
  980. //            else if ( HIDE_ALL_REMINDERS ) {
  981. //                for ( x = 0; x < allReminders.length; x++ ) {
  982. //                    if ( reminderFox_compareDates( allReminders[x].date, todaysDate) != -1 ) {
  983. //                        break;
  984. //                    }
  985. //                }
  986. //                // handle end case where x = length
  987. //                startIndex = x;
  988. //        
  989. //                // need to show reminders of yearly that have passed
  990. //                if ( startIndex == allReminders.length ) {                
  991. //                    startIndex = allReminders.length -1;
  992. //                }
  993. //                endIndex = startIndex + 1;  
  994. //                if ( endIndex > allReminders.length )  {
  995. //                    endIndex = allReminders.length;
  996. //                }
  997. //            }
  998.             // if there's only 1 reminder and the prefs are set to show prev/next, then just ignore the check
  999. //            else if ( !(allReminders.length == 1 && REPEAT_PREVIOUS_OCCURRENCES >= 1 &&  REPEAT_UPCOMING_OCCURRENCES >=1 ) )  {            
  1000. //                for ( x = 0; x < allReminders.length; x++ ) {
  1001. //                    if ( reminderFox_compareDates( allReminders[x].date, todaysDate) != -1 ) {
  1002. //                        break;
  1003. //                    }
  1004. //                }
  1005. //                
  1006. //                if ( REPEAT_PREVIOUS_OCCURRENCES == -1 ) { 
  1007. //                    startIndex = 0;
  1008. //                }
  1009. //                else {
  1010. //                    startIndex = x - REPEAT_PREVIOUS_OCCURRENCES;
  1011. //                    if ( startIndex < 0 ) {
  1012. //                        startIndex = 0;
  1013. //                    }
  1014. //                }
  1015. //                
  1016. //                if ( REPEAT_UPCOMING_OCCURRENCES == -1 ) {
  1017. //                    endIndex = allReminders.length;
  1018. //                }
  1019. //                else {
  1020. //                    endIndex = x + REPEAT_UPCOMING_OCCURRENCES;
  1021. //                    if ( endIndex > allReminders.length ) {
  1022. //                        endIndex = allReminders.length;
  1023. //                    }
  1024. //                }
  1025. //                
  1026. //                // if the user is showing no previous occurrences, we still want to show if a previous reminder is marked as RUC
  1027. //                if ( REPEAT_PREVIOUS_OCCURRENCES == 0 && 
  1028. //                    basereminder.remindUntilCompleted == REMINDERFOX_REMIND_UNTIL_COMPLETE_MARKED ) {
  1029. //                    if ( startIndex > 0  && startIndex == endIndex  ) { // eminderFox_compareDates( allReminders[x].date, todaysDate) == 1 ) {
  1030. //                        startIndex = startIndex - 1;                                                        
  1031. //                    }                    
  1032. //                }                                
  1033. //             }
  1034.         }
  1035.        for (  var j = startIndex; j < endIndex; j++ ) {        
  1036.             var reminder = allReminders[j];        
  1037.             reminder = reminderFox_processReminderDescription(reminder,  dateSpan.start.getFullYear(), false);    
  1038.             
  1039.             // if it's marked as RemindUntilComplete, this should be treated as Today's date            
  1040.              if ( reminder.remindUntilCompleted == REMINDERFOX_REMIND_UNTIL_COMPLETE_MARKED && j == startIndex ) {
  1041.                  var todaysDate = new Date();
  1042.                  if (  todaysDate.getFullYear() == year ) {   // only valid for current year in the calendar
  1043.                      var ignore = false;
  1044.                      var displayList = document.getElementById("displayType");    
  1045.                     if ( displayList != null ) {    
  1046.                         var displayListIndex = displayList.selectedIndex;
  1047.                         // month or week
  1048.                         if ( displayListIndex == 1 || displayListIndex == 2 ) {
  1049.                             // if the date is outside of the selected month/week, then just show it.
  1050.                             // Otherwise, go ahead and show it as Today's date.                            
  1051.                             if ( !( reminderFox_compareDates( todaysDate, dateSpan.start) > -1 &&
  1052.                                 reminderFox_compareDates( todaysDate, dateSpan.end) < 1 ) ) {
  1053.                                 ignore = true;
  1054.                             }
  1055.                         }
  1056.                     }
  1057.                     if ( !ignore ) {
  1058.                          reminder = reminderFox_cloneReminderFoxEvent(reminder);             
  1059.                         reminder.date  = new Date( todaysDate.getFullYear(), todaysDate.getMonth(), todaysDate.getDate(), 
  1060.                                      reminder.date.getHours(), reminder.date.getMinutes() );        
  1061.                     }
  1062.                  }
  1063.              }             
  1064.     
  1065.             monthArray = calendarReminderArray2[reminder.date.getMonth()];
  1066.             if ( monthArray == null ) {
  1067.                 monthArray = new Array(31);
  1068.                 calendarReminderArray2[reminder.date.getMonth()] = monthArray;
  1069.             }
  1070.                 
  1071.             monthDay = reminder.date.getDate();
  1072.             dayReminderArray = monthArray[monthDay - 1];
  1073.             if ( dayReminderArray == null ) {
  1074.                 dayReminderArray = new Array();
  1075.                 monthArray[monthDay - 1] = dayReminderArray;
  1076.             }
  1077.             length = dayReminderArray.length;
  1078.             
  1079.             var ignoreReminder = false;
  1080. //            if (HIDE_COMPLETED_ITEMS &&
  1081. //                 reminderFox_isCompletedForDate( reminder, reminder.date) )  {
  1082. //                ignoreReminder = true;                
  1083. //            }
  1084.             if ( !ignoreReminder ) {
  1085.                 dayReminderArray[length] = reminder;
  1086.             }
  1087.         }
  1088.     }
  1089.     
  1090.     return calendarReminderArray2;
  1091. }
  1092.  
  1093.  
  1094.  function redrawWeekNumbers(  ) {
  1095.      var showWeekNum = reminderFox_getPreferenceValue( REMINDER_FOX_SHOW_WEEK_NUMS_PREF ); // Week Numbering:  0 (none), 1 (default), 2 (ISO 8601)
  1096.      var weekGrid = document.getElementById( "oe-date-picker-month-week-grid");
  1097.      if ( showWeekNum != null && showWeekNum == 1 || showWeekNum == 2 ) {
  1098.          weekGrid.removeAttribute( "hidden" );
  1099.          // get week number for first week displayed in the calendar
  1100.          var startOfThisMonthDate = new Date(oeDatePicker.gSelectedDate.getFullYear(), oeDatePicker.gSelectedDate.getMonth(), 1);
  1101.         var dowOffset =  oeDatePicker.gStartingDayOfWeek;
  1102.         var newYear = new Date(startOfThisMonthDate.getFullYear(),0,1);
  1103.         var day = newYear.getDay() - dowOffset; //the day of week the year begins on
  1104.         day = (day >= 0 ? day : day + 7);
  1105.         var daynum = Math.floor((startOfThisMonthDate.getTime() - newYear.getTime() -
  1106.             (startOfThisMonthDate.getTimezoneOffset()-newYear.getTimezoneOffset())*60000)/86400000) + 1;
  1107.         var weeknum = Math.floor((daynum+day-1)/7); 
  1108.         var useISO = showWeekNum == 2; 
  1109.         if(!useISO || day < 4) {  // if using ISO standard, first week w/ day starting after Wed are 0-week; 
  1110.             weeknum = weeknum + 1; // otherwise, weeks start at 1
  1111.         }
  1112.         
  1113.        // now fill in calendar box with week #s    
  1114.        var endWeekIndex = 5;    
  1115.         for( var weekBoxIndex = 1; weekBoxIndex <= endWeekIndex; ++weekBoxIndex )  {
  1116.                // get the day text box
  1117.               var dayNumberItem = document.getElementById( "oe-date-picker-week-text-" + weekBoxIndex );
  1118.               dayNumberItem.setAttribute( "value", weeknum );
  1119.               weeknum++;
  1120.               // reset to week 1 at the end of the year
  1121.               if(weeknum > 52) {
  1122.                 weeknum = weeknum - 52;  
  1123.             }
  1124.         }
  1125.         
  1126.         // handle last row (as it may be empty)
  1127.             var lastWeekRow = document.getElementById( "oe-date-picker-month-day-text-36");
  1128.             var val = weeknum;
  1129.          if ( lastWeekRow.getAttribute( "value" ) == "" ) { 
  1130.              val = ""; // don't fill in the last calendar row; no dates fall in it.
  1131.          }
  1132.          var dayNumberItem = document.getElementById( "oe-date-picker-week-text-6" );
  1133.           dayNumberItem.setAttribute( "value", val );
  1134.      }
  1135.  }
  1136.  
  1137.  
  1138. function reminderFox_addMultipleEndDates(reminder, currentDate, multipleDayEvents) {
  1139.     if ( reminder.durationTime != null ) {
  1140.         if ( reminder.allDayEvent ) {
  1141.             if (reminder.durationTime >86400000 ) {   // 24 * 60 * 60 * 1000 = 1 day in ms
  1142.                 //var reminderInstanceDate = new Date(oeDatePicker.gSelectedDate.getFullYear(),oeDatePicker.gSelectedDate.getMonth(), dayNumber );
  1143.                 var reminderInstanceDate =reminder.date;
  1144.                 var reminderInstanceEndDate = new Date(reminderInstanceDate.getTime() + reminder.durationTime);        
  1145.                 reminderInstanceEndDate.setDate( reminderInstanceEndDate.getDate() - 1); // -1 enddate offset
  1146.                 
  1147.                 if ( reminderFox_compareDates(reminderInstanceEndDate, currentDate ) != -1 ) {
  1148.                     // set end date
  1149.                     multipleDayEvents[multipleDayEvents.length] = reminder;
  1150.                 }
  1151.             }
  1152.         }
  1153.         else {
  1154.             if ( reminder.durationTime > 60000 ) {
  1155.                 var reminderInstanceDate =reminder.date;
  1156.                 var reminderInstanceEndDate = new Date(reminderInstanceDate.getTime() + reminder.durationTime);    
  1157.                 
  1158.                 if (reminderInstanceEndDate.getMonth() == reminderInstanceDate.getMonth() &&
  1159.                     reminderInstanceEndDate.getDate() == reminderInstanceDate.getDate() ) {
  1160.                     // same days..  do nothing
  1161.                 }
  1162.                 // multiple days
  1163.                 else { 
  1164.                     // set end date
  1165.                     if ( reminderFox_compareDates(reminderInstanceEndDate, currentDate ) != -1 ) {
  1166.                         // set end date
  1167.                         multipleDayEvents[multipleDayEvents.length] = reminder;
  1168.                     }
  1169.                 }
  1170.             }
  1171.         }
  1172.     }    
  1173. }
  1174.  
  1175.  
  1176. function reminderFox_calendarTooltip(event, tooltipIdNumber ) {
  1177.      // clear old tooltip
  1178.         var tooltipItem = document.getElementById( "day-"+tooltipIdNumber  +"-tooltip");
  1179.      while (tooltipItem.hasChildNodes()) {
  1180.          tooltipItem.removeChild(tooltipItem.firstChild);
  1181.        }
  1182.        
  1183.    var monthArray = null;   
  1184.    var isReminder = true;
  1185.    var remindersTab = document.getElementById("remindersTab");
  1186.    var lastMonthArray = null;
  1187.    if ( remindersTab != null  ) {   // ignore this if we are doing a popup from within the Event dialog
  1188.         if ( isReminderTabSelected() ) {        
  1189.            if ( calendarReminderArray == null ) {    
  1190.                    createCalendarReminderArray();           
  1191.                }
  1192.                monthArray = calendarReminderArray[oeDatePicker.gSelectedDate.getMonth()];
  1193.                
  1194.             if ( oeDatePicker.gSelectedDate.getMonth() > 0 ) {
  1195.                     lastMonthArray = calendarReminderArray[oeDatePicker.gSelectedDate.getMonth()-1];
  1196.                 }
  1197.         }
  1198.         else {
  1199.             isReminder = false;
  1200.                if ( calendarTodoArray == null ) {
  1201.                    createCalendarTodoArray();
  1202.                }
  1203.                 monthArray = calendarTodoArray[oeDatePicker.gSelectedDate.getMonth()];
  1204.                 if ( oeDatePicker.gSelectedDate.getMonth() > 0 ) {
  1205.                     lastMonthArray = calendarTodoArray[oeDatePicker.gSelectedDate.getMonth()-1];
  1206.                 }
  1207.         }
  1208.    }
  1209.    else { 
  1210.      if ( oeDatePicker.launchAdd ) {
  1211.        var calendarReminderArray2 = null;
  1212.        if ( calendarReminderArray2 == null ) {               
  1213.                calendarReminderArray2 = createCalendarReminderArray2();                                  
  1214.            }
  1215.            monthArray = calendarReminderArray2[oeDatePicker.gSelectedDate.getMonth()];
  1216.            if ( oeDatePicker.gSelectedDate.getMonth() > 0 ) {
  1217.                lastMonthArray = calendarReminderArray2[oeDatePicker.gSelectedDate.getMonth()-1];
  1218.            }
  1219.       }
  1220.    }
  1221.    
  1222.    // check last month for any reminders with end dates carrying over to this month
  1223.     var currentSelectedDate = new Date(oeDatePicker.gSelectedDate.getFullYear(), oeDatePicker.gSelectedDate.getMonth(), tooltipIdNumber -1);
  1224.     var multipleDayEvents = new Array();
  1225.     // for performance; we just check last 3 days of the previous month
  1226.      if ( lastMonthArray != null && lastMonthArray.length > 0) {
  1227.          for ( var i = lastMonthArray.length-4; i < lastMonthArray.length; i++ ) {
  1228.              var reminderDaysArray = lastMonthArray[i];
  1229.              if ( reminderDaysArray != null ) { 
  1230.                     for ( var j = 0; j < reminderDaysArray.length; j++ ) {
  1231.                         var reminder = reminderDaysArray[j];
  1232.                         reminderFox_addMultipleEndDates( reminder, currentSelectedDate, multipleDayEvents );
  1233.                     }    
  1234.              }
  1235.          }
  1236.      }
  1237.  
  1238.      if ( monthArray != null ) {
  1239.        // check previous month days prior to today with end dates carrying over to today or beyond...
  1240.        for ( var i = 0; i < (tooltipIdNumber-1); i++ ) { 
  1241.              var reminderDaysArray = monthArray[i];
  1242.              if ( reminderDaysArray != null ) { 
  1243.                  for ( var j = 0; j < reminderDaysArray.length; j++ ) {
  1244.                      var reminder = reminderDaysArray[j];
  1245.                      reminderFox_addMultipleEndDates( reminder, currentSelectedDate, multipleDayEvents );    
  1246.                  }    
  1247.              }
  1248.          }
  1249.          
  1250.          
  1251.          var reminderDaysArray = monthArray[tooltipIdNumber-1];
  1252.            if ( reminderDaysArray != null ) {
  1253.             var multipleEventsOnThisDate = (reminderDaysArray.length + multipleDayEvents.length) > 1 ;
  1254.                 for ( var  i = 0; i < reminderDaysArray.length; i++ ) {
  1255.                     var drawSeparator = i > 0;
  1256.                 reminderFox_addCalendarReminderToTooltip(tooltipItem, reminderDaysArray[i], multipleEventsOnThisDate, drawSeparator);
  1257.             }
  1258.            }
  1259.      }
  1260.      
  1261.      if ( multipleDayEvents != null ) {    
  1262.          var reminderDaysArrayLen = 0;
  1263.          if (  reminderDaysArray != null ) {
  1264.               reminderDaysArrayLen = reminderDaysArray.length;
  1265.          }
  1266.         for ( var  i = 0; i < multipleDayEvents.length; i++ ) {
  1267.                 var drawSeparator = reminderDaysArrayLen > 0 || i > 0;
  1268.             reminderFox_addCalendarReminderToTooltip(tooltipItem, multipleDayEvents[i], multipleEventsOnThisDate, drawSeparator);
  1269.         }
  1270.      }
  1271.     
  1272.    return true;
  1273. }
  1274.  
  1275. function reminderFox_addCalendarReminderToTooltip(tooltipItem, reminder, multipleEventsOnThisDate, drawSeparator ) {
  1276.        if ( drawSeparator ) {
  1277.         var hbox = document.createElement("hbox");        
  1278.         hbox.setAttribute( "class", "reminderFox-footer3");
  1279.         hbox.setAttribute( "align", "center");
  1280.         tooltipItem.appendChild(hbox);    
  1281.         
  1282.         hbox = document.createElement("hbox");        
  1283.         hbox.setAttribute( "class", "reminderFox-footer2");
  1284.         hbox.setAttribute( "align", "center");
  1285.         tooltipItem.appendChild(hbox);    
  1286.     }
  1287.     var important = false;
  1288.     if ( reminder.priority == REMINDER_PRIORITY_IMPORTANT ) {
  1289.         important = true;
  1290.     }
  1291.     
  1292.     // see if current instance of reminder is completed
  1293.     var completed = false;    
  1294.     if  ( reminderFox_isCompletedForDate( reminder, reminder.date )  ) {
  1295.         completed = true;
  1296.     }  
  1297.     
  1298.     addTooltipWithLabel( tooltipItem, null, reminder.summary, important, completed, reminderFox_getBundle().getString("rf.html.heading.description")  ); 
  1299.     
  1300.     if ( reminder.date != null ) { 
  1301.         var dateString = reminderFox_getDateVariableString( reminder, reminder.date);
  1302.         var timeCellLabel = reminderFox_mail_getTimeString(reminder.date);
  1303.         if ( !reminder.allDayEvent ) {
  1304.             dateString = dateString + ", " + timeCellLabel;
  1305.         }
  1306.         
  1307.         if ( reminder.durationTime != null ) {
  1308.             var reminderInstanceEndDate = new Date(parseInt(reminder.date.getTime()) + reminder.durationTime);        
  1309.             if ( reminder.allDayEvent ) {
  1310.                 if (reminder.durationTime >86400000 ) {   // 24 * 60 * 60 * 1000 = 1 day in ms
  1311.                     reminderInstanceEndDate.setDate( reminderInstanceEndDate.getDate() - 1); // -1 enddate offset
  1312.                     var endDateStr = reminderFox_getDateVariableString( reminder, reminderInstanceEndDate);
  1313.                     dateString += " - " +  endDateStr;
  1314.                 }
  1315.             }
  1316.             else {
  1317.                 var endTime = reminderFox_mail_getTimeString(reminderInstanceEndDate);
  1318.                 if (reminderInstanceEndDate.getMonth() == reminder.date.getMonth() &&
  1319.                     reminderInstanceEndDate.getDate() == reminder.date.getDate() ) {
  1320.                     // same days.. 
  1321.                     dateString += " - " +  endTime;
  1322.                 }
  1323.                 // multiple days
  1324.                 else { 
  1325.                     var endDateStr = reminderFox_getDateVariableString( reminder, reminderInstanceEndDate);
  1326.                     dateString += " - " +  endDateStr + ", " + endTime;
  1327.                 }
  1328.             }
  1329.         }
  1330.         addTooltipWithLabel( tooltipItem,null, dateString, false, false, reminderFox_getBundle().getString("rf.html.heading.date") );
  1331.     }
  1332.     
  1333.     if ( reminder.categories != null && reminder.categories != "" ) {            
  1334.         addTooltipWithLabel( tooltipItem, null, reminder.categories, false, false, reminderFox_getBundle().getString("rf.add.reminders.tooltip.categories"));         
  1335.     }
  1336.     
  1337.     if ( reminder.completedDate != null ) {
  1338.         var completedDate = reminderFox_getDateVariableString( reminder, reminder.completedDate );
  1339.         addTooltipWithLabel( tooltipItem, null, completedDate, false, false, reminderFox_getBundle().getString("rf.add.reminders.tooltip.dateCompleted") );
  1340.         
  1341.     }
  1342.     if ( reminder.location != null && reminder.location != "" ) {            
  1343.         addTooltipWithLabel( tooltipItem, null, reminder.location, false, false, reminderFox_getBundle().getString("rf.add.reminders.tooltip.locaton") );  
  1344.     }
  1345.     
  1346.     if ( reminder.url != null && reminder.url != "" ) {            
  1347.         addTooltipWithLabel( tooltipItem, null, reminder.url, false, false, reminderFox_getBundle().getString("rf.add.reminders.tooltip.url") );
  1348.     }                
  1349.             
  1350.     // add notes to to tooltip (if applicable)        
  1351.      if ( reminder.notes != null ) {
  1352.          if ( multipleEventsOnThisDate ) { 
  1353.                addNotesToTooltip( reminder.notes, tooltipItem, 10 );  // limit to 6 lines of notes
  1354.          }
  1355.          else {
  1356.              addNotesToTooltip( reminder.notes, tooltipItem );
  1357.          }
  1358.    }        
  1359. }
  1360.  
  1361.  
  1362. function addTooltipWithLabel( tooltipItem, columnId, value, importantStatus, completedStatus, labelText) {
  1363.     var hbox = document.createElement("hbox");        
  1364.     var columnLabel;    
  1365.     if ( columnId == null ) {
  1366.         columnLabel = labelText;
  1367.     }
  1368.     else {
  1369.         columnLabel = getLabelForColumn(columnId);        
  1370.     }
  1371.     
  1372.     var title = document.createElement("description");
  1373.     title.setAttribute("value",columnLabel + ": ");
  1374.     title.setAttribute( "style", "font-weight:bold");
  1375.     hbox.appendChild( title );
  1376.     
  1377.     var tooltipValue = document.createElement("description");
  1378.     tooltipValue.setAttribute("value", value );
  1379.     
  1380.     if ( importantStatus && completedStatus ) {
  1381.         tooltipValue.setAttribute( "style", " text-decoration: line-through; color: red" );
  1382.     }
  1383.     else if ( importantStatus ) {
  1384.         tooltipValue.setAttribute( "style", "color: red" );
  1385.     }
  1386.     else if ( completedStatus ) {
  1387.         tooltipValue.setAttribute( "style", " text-decoration: line-through" );
  1388.     }
  1389.     
  1390.     hbox.appendChild( tooltipValue );
  1391.     
  1392.     tooltipItem.appendChild(hbox);        
  1393. }
  1394.  
  1395.  
  1396. function reminderFox_getDateVariableString(reminder, date )  {
  1397.     var dateVariableString = null;
  1398.     try {
  1399.         dateVariableString = reminderFox_getUnicodePref(REMINDER_FOX_PREF + "." + REMINDER_FOX_LIST_DATE_LABEL);
  1400.         if ( dateVariableString != REMINDER_FOX_LIST_DATE_LABEL_DEFAULT) {
  1401.             useDefaultDate = false;
  1402.         }
  1403.     } catch(e) {
  1404.          dateVariableString = REMINDER_FOX_LIST_DATE_LABEL_DEFAULT;
  1405.     }
  1406.     return reminderFox_getDateVariable( reminder, date, dateVariableString );
  1407. }
  1408.  
  1409.  
  1410.